package pe.gob.foncodes.ssa.bs.seguridad.domain;

import java.io.Serializable;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import pe.gob.foncodes.ssa.bs.common.domain.EntidadBase;
import pe.gob.foncodes.ssa.bs.common.util.Constante;

/**
 *
 * @author Gcarlos
 */
@Entity
@Table(name = "PERFIL", catalog = "", schema = "SSA")
@NamedQueries({
    @NamedQuery(name = "Perfil.findAll", query = "SELECT p FROM Perfil p"),
    @NamedQuery(name = "Perfil.findByFlgActivo", query = "SELECT p FROM Perfil p WHERE p.flgActivo = ?1"),
    @NamedQuery(name = "Perfil.findByTipUsuario", query = "SELECT p FROM Perfil p WHERE p.tipUsuario = :tipUsuario"),
    @NamedQuery(name = "Perfil.findByTxtPerfilAndNidModulo", query = "SELECT p FROM Perfil p WHERE UPPER(p.txtPerfil) LIKE ?1 AND p.nidModulo.id = ?2 ORDER BY p.id"),
    @NamedQuery(name = "Perfil.findByNidModulo", query = "SELECT p FROM Perfil p WHERE p.nidModulo.id = ?1 ORDER BY p.id"),
    @NamedQuery(name = "Perfil.findByNidModuloAndFlgActivo", query = "SELECT p FROM Perfil p WHERE p.nidModulo.id = ?1 "
                                                                    + "AND p.tipUsuario = ?2 AND p.flgActivo = ?3 ORDER BY p.id"),
    @NamedQuery(name = "Perfil.findByModulo", query = "SELECT p"
                                                    + " FROM Perfil p"
                                                    + " WHERE p.nidModulo.id = ?1"
                                                    + " AND p.flgActivo = '" + Constante.ESTADO_ACTIVO +"'"),
    @NamedQuery(name = "Perfil.findByNidUsuario", query = "SELECT p"
                                                        + " FROM UsuarioPerfil up"
                                                        + " INNER JOIN up.nidPerfil p"
                                                        + " INNER JOIN up.nidUsuario u"
                                                        + " WHERE u.id = ?1"
                                                        + " AND up.flgActivo = '" + Constante.ESTADO_ACTIVO +"'"
                                                        + " AND p.flgActivo = '" + Constante.ESTADO_ACTIVO +"'"),
    @NamedQuery(name = "Perfil.findByIdPerfil", query = "SELECT p FROM Perfil p WHERE p.id = ?1")    
})
public class Perfil extends EntidadBase implements Serializable {

    private static final long serialVersionUID = 1L;
    private String txtPerfil;    
    private String flgActivo;
    private String tipUsuario;
    private String txtObservacion;
    private List<PerfilOpcion> perfilOpcionList;
    private Modulo nidModulo;
    private Conexion nidConexion;
    private List<UsuarioPerfil> usuarioPerfilList;
    private String flgBase;

    public Perfil() {
    }

    @Id
    @Basic(optional = false)
    @NotNull
    @SequenceGenerator(schema="SSA", name="SQ_PERFIL",sequenceName="SSA.SQ_PERFIL", allocationSize=1)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SQ_PERFIL")
    @Column(name = "NID_PERFIL", nullable = false, precision = 0, scale = -127)
    @Override
    public Long getId() {
        return super.getId();
    }
    
    @Column(name = "NID_CONTROL_ACCESO_WEB", precision = 0, scale = -127)
    @Override
    public Long getNIdCtrlAccesoWeb() {
        return super.getNIdCtrlAccesoWeb();
    }
    
    @Basic(optional = false)
    @Column(name = "TXT_PERFIL", nullable = false, length = 250)
    public String getTxtPerfil() {
        return txtPerfil;
    }

    public void setTxtPerfil(String txtPerfil) {
        this.txtPerfil = txtPerfil;
    }

    @Basic(optional = false)
    @NotNull
    @Column(name = "FLG_ACTIVO", nullable = false)
    public String getFlgActivo() {
        return flgActivo;
    }

    public void setFlgActivo(String flgActivo) {
        this.flgActivo = flgActivo;
    }

    @Basic(optional = false)
    @NotNull
    @Column(name = "TIP_USUARIO", nullable = false)
    public String getTipUsuario() {
        return tipUsuario;
    }

    public void setTipUsuario(String tipUsuario) {
        this.tipUsuario = tipUsuario;
    }

    @Column(name = "TXT_OBSERVACION", length = 250)
    public String getTxtObservacion() {
        return txtObservacion;
    }

    public void setTxtObservacion(String txtObservacion) {
        this.txtObservacion = txtObservacion;
    }
    
    @NotNull
    @Column(name = "FLG_PERFIL_BASE", nullable = false)
    public String getFlgBase() {
        return flgBase;
    }

    public void setFlgBase(String flgBase) {
        this.flgBase = flgBase;
    }
    
    @OneToMany(mappedBy = "perfil")
    public List<PerfilOpcion> getPerfilOpcionList() {
        return perfilOpcionList;
    }

    public void setPerfilOpcionList(List<PerfilOpcion> perfilOpcionList) {
        this.perfilOpcionList = perfilOpcionList;
    }

    @JoinColumn(name = "NID_MODULO", referencedColumnName = "NID_MODULO", nullable = false)
    @ManyToOne(optional = false)
    public Modulo getNidModulo() {
        return nidModulo;
    }

    public void setNidModulo(Modulo nidModulo) {
        this.nidModulo = nidModulo;
    }

    @JoinColumn(name = "NID_CONEXION", referencedColumnName = "NID_CONEXION", nullable = false)
    @ManyToOne(optional = false)
    public Conexion getNidConexion() {
        return nidConexion;
    }

    public void setNidConexion(Conexion nidConexion) {
        this.nidConexion = nidConexion;
    }

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "nidPerfil")
    public List<UsuarioPerfil> getUsuarioPerfilList() {
        return usuarioPerfilList;
    }

    public void setUsuarioPerfilList(List<UsuarioPerfil> usuarioPerfilList) {
        this.usuarioPerfilList = usuarioPerfilList;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (getId() != null ? getId().hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Perfil)) {
            return false;
        }
        Perfil other = (Perfil) object;
        if ((this.getId() == null && other.getId() != null) || (this.getId() != null && !this.getId().equals(other.getId()))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "pe.gob.foncodes.ssa.bs.seguridad.domain.Perfil[ nidPerfil=" + getId() + " ]";
    }
}
